//给你一个由 正 整数组成的数组 nums 。 
//
// 如果数组中的某个子数组满足下述条件，则称之为 完全子数组 ： 
//
// 
// 子数组中 不同 元素的数目等于整个数组不同元素的数目。 
// 
//
// 返回数组中 完全子数组 的数目。 
//
// 子数组 是数组中的一个连续非空序列。 
//
// 
//
// 示例 1： 
//
// 输入：nums = [1,3,1,2,2]
//输出：4
//解释：完全子数组有：[1,3,1,2]、[1,3,1,2,2]、[3,1,2] 和 [3,1,2,2] 。
// 
//
// 示例 2： 
//
// 输入：nums = [5,5,5,5]
//输出：10
//解释：数组仅由整数 5 组成，所以任意子数组都满足完全子数组的条件。子数组的总数为 10 。
// 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 1000 
// 1 <= nums[i] <= 2000 
// 
//
// Related Topics 数组 哈希表 滑动窗口 👍 65 👎 0


package LeetCode.editor.cn;


import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

/**
 * @author ldltd
 * @date 2025-04-24 10:13:23
 * @description 2799.统计完全子数组的数目
 
 */
 
public class CountCompleteSubarraysInAnArray {
    public static void main(String[] args) {
    //测试代码
    CountCompleteSubarraysInAnArray fun = new CountCompleteSubarraysInAnArray();
    Solution solution= fun.new Solution();
    
    }

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
        public int countCompleteSubarrays(int[] nums) {
            int res = 0;
            Map<Integer, Integer> cnt = new HashMap<>();
            int n = nums.length;
            int right = 0;
            //先统计一下一共有多少个不一样的
            int distinct = new HashSet<>(Arrays.asList(Arrays.stream(nums).boxed().toArray(Integer[]::new))).size();
            //每次固定左边界l，然后统计窗口内的各个元素个数，如果不满足就不断右移右边界直到满足，此时右边界及包含右边元素的所有子数组都满足
            //然后遍历的时候再增加左边界，直到结束
            for (int left = 0; left < n; left++) {
                if (left > 0) {
                    int remove = nums[left - 1];
                    cnt.put(remove, cnt.get(remove) - 1);
                    if (cnt.get(remove) == 0) {
                        cnt.remove(remove);
                    }
                }
                while (right < n && cnt.size() < distinct) {
                    int add = nums[right];
                    cnt.put(add, cnt.getOrDefault(add, 0) + 1);
                    right++;
                }
                if (cnt.size() == distinct) {
                    res += (n - right + 1);
                }
            }
            return res;
        }
}
//leetcode submit region end(Prohibit modification and deletion)

}
